package org.baicaixiaozhan.learncommon.util;

/**
 * 前置条件判断，对 {@link com.google.common.base.Preconditions} 工具类的补充
 *
 * @since 2021/6/2
 * @author baicaixiaozhan
 */
public final class PreconditionUtils {

    private PreconditionUtils() {
        throw new AssertionError();
    }

    /**
     * 确保涉及调用方法的一个或多个参数的表达式的真实性。
     *
     * @param expression 表达式
     * @param runnable 定制方法
     */
    public static void checkArgument(boolean expression, Runnable runnable) {
        if (!expression) {
            runnable.run();
        }
    }

    /**
     * 确保涉及调用实例状态的表达式的真实性，但不涉及调用方法的任何参数。
     *
     * @param expression 表达式
     * @param runnable 定制方法
     */
    public static void checkState(boolean expression, Runnable runnable) {
        if (!expression) {
            runnable.run();
        }
    }

    /**
     * 确保作为参数传递给调用方法的对象引用不为空。
     *
     * @param reference 对象引用
     * @param runnable 定制方法
     * @return 对象引用不为 NULL，返回对象本身。反之，执行定制方法（一般会抛出异常）
     */
    public static <T> T checkNotNull(T reference, Runnable runnable) {
        if (reference == null) {
            runnable.run();
        }
        return reference;
    }
}
